package main

import (
    "fmt"
    "log" // 用于导入第三方或本地包

    // 导入我们自定义的包。
    // 路径 "x-golabg/09_packages_modules/mathutils" 是相对于 Go Module 的根路径。
    // 在 Go 1.16+ 中，如果你的项目是一个模块，Go 会自动处理这种本地导入。
    "x-golabg/09_packages_modules/mathutils"
)

func main() {
    // --- 使用自定义包 ---
    fmt.Println("--- 使用自定义包 mathutils ---")

    // 调用 mathutils 包中的公开函数
    sum := mathutils.Add(10, 5)
    fmt.Printf("mathutils.Add(10, 5) 的结果是: %d\n", sum)

    num := 7
    isEven := mathutils.IsEven(num)
    fmt.Printf("mathutils.IsEven(%d) 的结果是: %t\n", num, isEven)

    description := mathutils.DescribeNumber(num)
    fmt.Println("mathutils.DescribeNumber(7) 的结果是:", description)

    // 尝试调用私有函数会导致编译错误
    // mathutils.internalHelper(10) // 编译错误: cannot refer to unexported name mathutils.internalHelper

    // --- 关于 Go Modules ---
    /*
        什么是 Go Module？
        Go Module 是 Go 语言的官方依赖管理系统，自 Go 1.11 引入。
        它解决了过去 GOPATH 的诸多不便，让项目可以独立存在于任何目录。

        如何创建一个 Module？
        在你的项目根目录下运行：
        go mod init <module_name>
        例如：go mod init github.com/your-username/your-project

        这会创建一个 go.mod 文件，它定义了你的模块路径和依赖项。

        go.mod 文件示例：
        module github.com/your-username/your-project

        go 1.21

        require (
            github.com/some/dependency v1.2.3
            golang.org/x/text v0.9.0
        )

        如何管理依赖？
        - `go get <package_path>@<version>`: 添加或更新依赖。
          例如：go get github.com/gin-gonic/gin@v1.9.1
        - `go build`, `go run`, `go test`: 这些命令会自动根据需要添加、更新或移除依赖。
        - `go mod tidy`: 清理不再使用的依赖，并添加缺失的依赖。

        本地包导入：
        在本例中，我们能够在 main.go 中导入 "x-golabg/09_packages_modules/mathutils"，
        是因为 Go 在寻找模块路径下的包。如果整个 `x-golabg` 目录是一个模块（即根目录有 go.mod 文件），
        Go 就能正确解析这个路径。

        如果当前 `x-golabg` 目录还不是一个模块，你可以在 `x-golabg` 目录下运行：
        `go mod init x-golabg`
        这样，当前目录及其所有子目录就都属于 `x-golabg` 这个模块了。
    */

    // --- 使用第三方包的示例 (仅作说明，不会实际执行) ---
    fmt.Println("\n--- 使用第三方包的示例 (说明) ---")
    fmt.Println("例如，如果我们使用 `go get github.com/sirupsen/logrus` 安装了 logrus 包，")
    fmt.Println("我们就可以这样导入和使用它：")
    fmt.Println(`
    import (
        log "github.com/sirupsen/logrus"
    )

    func main() {
        log.WithFields(log.Fields{
            "event": "test",
            "topic": "logging",
        }).Info("这是一个日志消息")
    }
    `)
    fmt.Println("注意：为了简化，本示例中使用了标准库的 log 包。")
    log.Println("这是一个使用标准库 log 包的日志消息。")
}